//
//  Network.h
//  面试题
//
//  Created by Toj on 8/8/21.
//

https://haokan.baidu.com/v?vid=13051733829198011014
https://haokan.baidu.com/v?vid=979765886402432268
https://haokan.baidu.com/v?vid=12407866366493300787
https://haokan.baidu.com/v?vid=4938177959295584420
https://haokan.baidu.com/v?vid=6129757757557040239
https://haokan.baidu.com/v?vid=5311936712526735290

#pragma mark - ISO - 网络7层
1. 应用层               应用层
2. 表示层
3. 会话层
4. 传输层      ->>      传输层
5. 网络层               网络层
6. 数据链路层            网络接口层
7. 物理层

#pragma mark - 应用层
应用层: 显示在应用上
表示层: 发送的都表示什么
会话层: 发送的是什么, 通过特殊格式知道是什么

#pragma mark - 传输控制层
socket(TCP, UDP)

#pragma mark - 网络层
#pragma mark IP
IP: 发送给谁: 交换机/ 路由器

前期需要知道:
本机地址: 127.0.0.1
IP地址 为什么是 255.255.255.255
计算机32位
平均分4位 一份8位
2的8次方 = 256
计算机从0开始 所以256-1

互联网是什么?
[[局域网 -> 局域网] ->
[[局域网] -> [局域网] -> [局域网]
[局域网]] -> [局域网], 这样就合成了互联网

路由表: 通过路由表知道发送给那个局域网,
 局域网内的路由表就知道再发送给那个局域网, 最后通过局域网内就知道发送给那个路由IP上了,
这个流程类似于链表形式
 
路由表里有这么几个值
 1. Destination: 目的IP
 2. Gateway: 网关
 3. Genmask: 子网掩码
 
 一个IP请求最终通过谁发送出去
 1. 网络号 = ip & mask【子网掩码】,
 2. 通过网络号找到对应的目的IP,
 3. 通过目的IP找到对应的网关, 就知道发送给谁
3.1. 网络号对应的网关 = 0.0.0.0(空), 就知道局域内的ip请求
3.2. 网络号对应的网关 = [....](有值), 就知道通过路由转发发送
 
1. 问题来了?
 目的IP + 网关 哪里来的
 ARP 请求 缓存到路由表里, 就知道发送给的IP
2. 问题来了?
 一个数据包包含一个请求IP地址够用吗?
 如果数据返回怎么往回定位, 就需要依靠数据链路层了
 
#pragma mark Port端口
不同Port 区分同一个IP的不同服务
2进制的高低位 互换 80 -

 #pragma mark - 数据链路层
网卡MAC地址 就知道了数据返回我应该给谁返回

 #pragma mark - 物理层
 从一个故事开始
 情人节发明的 第一台计算机"打炮"的 计算打炮弹的时间
 打孔定义2进制的来源 0/1, 0/1 电流很像高低电频, 所以后来就把数字0/1信号借用电话线传输, 到现在的光传输

 电信号 -> 二进制数字信号,
 二进制数字信号 -> 电信号
 数据的最底层, 中继器放大电信号: 网线
